<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // Promise 是异步编程的一种解决方案，比传统的解决方案——回调函数和事件——更合理和更强大。

    // 注意: Promise并没有改变异步执行机制, 而是通过封装处理 将代码变得更像同步

    // 传统的异步解决方案
    // setTimeout(function () { }, 500)

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果。从语法上说，Promise 是一个对象，从它可以获取异步操作的消息

    // 如何创建Promise?  => 构造函数创建(得到实例化对象)
    // 构造函数Promise,接收一个回调函数作为参数(容器),里面可以执行异步操作(同步也可以)

    // var p = new Promise(function () {
    //     // 容器 => 需要执行的代码(异步/同步) => 同步任务(Promise创建时立即执行)
    //     console.log("回调函数代码执行");
    // });

    // // 通过构造函数创建的对象 => 实例化对象
    // console.log(p);  // Promise实例/ Promise对象

    // p = {
    //     PromiseState:"pending", // Promise状态 (默认进行中)
    //     PromiseResult: undefined , // Promise的结果(存储数据)
    // }

    // Promise实例的状态
    // pending   进行中
    // fulfilled 已成功
    // rejected  已失败

    // 如何改变Promise实例的状态?
    //  构造函数Promise,接收一个回调函数作为参数(容器),里面可以执行异步操作(同步也可以),回调函数 有两个参数resolve,reject  用于改变Promise实例的状态
    // resolve()  将Promise实例的状态由pending(进行中) 改为 fulfilled(已成功)
    // reject()   将Promise实例的状态由pending(进行中) 改为 rejected(已失败)

    // resolve()/reject()  除了可以改变Promise实例的状态 还可以接收一个参数,作为Promise实例中存储的数据


    // Promise实例的特征:
    // (1) 对象的状态不受外界影响。Promise对象代表一个异步操作，有三种状态：pending（进行中）、fulfilled（已成功）和rejected（已失败）。只有异步操作的结果，可以决定当前是哪一种状态，任何其他操作都无法改变这个状态
    //  注意: 只有官方提供的方法resolve, reject 可以改变Promise实例的状态,，任何其他操作都无法改变这个状态 (根据操作者的需求来改)

    // （2）一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型）

    // 注意，为了行文方便，本章后面的resolved统一只指fulfilled状态，不包含rejected状态。



    debugger;

    // 异步代码 => 未来改变状态
    var p = new Promise(function (resolve, reject) { //形参
        // 容器 => 需要执行的代码(异步/同步) => 同步任务(Promise创建时立即执行) 
        debugger;
        console.log("回调函数代码执行");

        setTimeout(function () {
            debugger;
            for (var i = 1; i <= 10; i++) {
                console.log(i);
            }
            resolve(true); // Promise {<fulfilled>: true}
            reject(false); // Promise {<rejected>: false}

            console.log("异步操作结束:", p);
        }, 2000);

    });

    console.log(p); // Promise <pending>




</script>

</html>